package com.smart.community.payment.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

/**
 * 支付配置类
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-01-29
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "payment")
public class PaymentConfig {

    /**
     * 通用配置
     */
    private CommonConfig common = new CommonConfig();

    /**
     * 支付宝配置
     */
    private AlipayConfig alipay = new AlipayConfig();

    /**
     * 微信支付配置
     */
    private WechatConfig wechat = new WechatConfig();

    /**
     * 银行卡支付配置
     */
    private BankConfig bank = new BankConfig();

    /**
     * 余额支付配置
     */
    private BalanceConfig balance = new BalanceConfig();

    /**
     * 验证支付方式是否可用
     * 
     * @param method 支付方式
     * @return 是否可用
     */
    public boolean isPaymentMethodAvailable(String method) {
        if (!StringUtils.hasText(method)) {
            return false;
        }
        
        switch (method.toLowerCase()) {
            case "alipay":
                return alipay.isEnabled() && isAlipayConfigValid();
            case "wechat":
                return wechat.isEnabled() && isWechatConfigValid();
            case "bank":
                return bank.isEnabled() && isBankConfigValid();
            case "balance":
                return balance.isEnabled();
            default:
                return false;
        }
    }

    /**
     * 获取支付方式名称
     * 
     * @param method 支付方式
     * @return 支付方式名称
     */
    public String getPaymentMethodName(String method) {
        if (!StringUtils.hasText(method)) {
            return "未知支付方式";
        }
        
        switch (method.toLowerCase()) {
            case "alipay":
                return "支付宝";
            case "wechat":
                return "微信支付";
            case "bank":
                return "银行卡支付";
            case "balance":
                return "余额支付";
            default:
                return "未知支付方式";
        }
    }

    /**
     * 获取支付超时时间（分钟）
     * 
     * @param method 支付方式
     * @return 超时时间（分钟）
     */
    public int getPaymentTimeout(String method) {
        if (!StringUtils.hasText(method)) {
            return common.getOrderExpireMinutes();
        }
        
        switch (method.toLowerCase()) {
            case "alipay":
                return alipay.getTimeout();
            case "wechat":
                return wechat.getTimeout();
            case "bank":
                return bank.getTimeout();
            case "balance":
                return common.getOrderExpireMinutes();
            default:
                return common.getOrderExpireMinutes();
        }
    }

    /**
     * 检查支付宝是否配置完整
     * 
     * @return 是否配置完整
     */
    public boolean isAlipayConfigValid() {
        return isNotBlank(alipay.getAppId())
            && isNotBlank(alipay.getPrivateKey())
            && isNotBlank(alipay.getAlipayPublicKey());
    }

    /**
     * 检查微信支付是否配置完整
     * 
     * @return 是否配置完整
     */
    public boolean isWechatConfigValid() {
        return isNotBlank(wechat.getAppId())
            && isNotBlank(wechat.getMchId())
            && isNotBlank(wechat.getMchKey());
    }

    /**
     * 检查银行卡支付是否配置完整
     * 
     * @return 是否配置完整
     */
    public boolean isBankConfigValid() {
        return isNotBlank(bank.getMerchantId())
            && isNotBlank(bank.getMerchantKey());
    }

    /**
     * 检查余额支付是否启用
     * 
     * @return 是否启用
     */
    public boolean isBalanceEnabled() {
        return balance.isEnabled();
    }

    /**
     * 检查字符串是否不为空
     * 
     * @param str 字符串
     * @return 是否不为空
     */
    private boolean isNotBlank(String str) {
        return StringUtils.hasText(str);
    }

    /**
     * 验证配置完整性
     * 
     * @return 验证结果
     */
    public boolean validateConfig() {
        // 检查通用配置
        if (common.getOrderExpireMinutes() <= 0) {
            return false;
        }
        
        // 检查至少有一种支付方式可用
        return isPaymentMethodAvailable("alipay") 
            || isPaymentMethodAvailable("wechat") 
            || isPaymentMethodAvailable("bank") 
            || isPaymentMethodAvailable("balance");
    }

    /**
     * 通用配置
     */
    @Data
    public static class CommonConfig {
        /**
         * 支付订单有效期（分钟）
         */
        private int orderExpireMinutes = 30;

        /**
         * 支付重试最大次数
         */
        private int maxRetryCount = 3;

        /**
         * 异步通知最大重试次数
         */
        private int maxNotifyRetry = 5;

        /**
         * 异步通知重试间隔（秒）
         */
        private int notifyRetryInterval = 30;

        /**
         * 密码错误最大次数
         */
        private int maxPasswordRetry = 5;

        /**
         * 最大单次支付金额（元）
         */
        private double maxSingleAmount = 10000.00;

        /**
         * 单用户单日支付限额（元）
         */
        private double dailyUserLimit = 50000.00;

        /**
         * 社区单日支付限额（元）
         */
        private double dailyCommunityLimit = 1000000.00;

        /**
         * 是否启用风控检查
         */
        private boolean enableRiskControl = true;

        /**
         * 是否启用支付日志
         */
        private boolean enablePaymentLog = true;

        /**
         * 是否需要支付密码
         */
        private boolean requirePassword = true;

        /**
         * 字符编码
         */
        private String charset = "UTF-8";

        /**
         * 数据格式
         */
        private String format = "JSON";

        /**
         * 支付回调地址
         */
        private String notifyUrl = "https://api.smart-community.com/payment/notify";
    }

    /**
     * 支付宝配置
     */
    @Data
    public static class AlipayConfig {
        /**
         * 是否启用
         */
        private boolean enabled = true;

        /**
         * 超时时间（分钟）
         */
        private int timeout = 30;

        /**
         * 应用ID
         */
        private String appId = "2021001234567890";

        /**
         * 应用私钥
         */
        private String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+demo_private_key";

        /**
         * 支付宝公钥
         */
        private String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+demo_alipay_public_key";

        /**
         * 支付宝网关地址
         */
        private String gatewayUrl = "https://openapi.alipay.com/gateway.do";

        /**
         * 签名类型
         */
        private String signType = "RSA2";

        /**
         * 证书路径（退款时需要）
         */
        private String certPath = "/cert/alipay/app_cert.pem";
    }

    /**
     * 微信支付配置
     */
    @Data
    public static class WechatConfig {
        /**
         * 是否启用
         */
        private boolean enabled = true;

        /**
         * 超时时间（分钟）
         */
        private int timeout = 30;

        /**
         * 应用ID
         */
        private String appId = "wx_demo_app_id";

        /**
         * 商户号
         */
        private String mchId = "1234567890";

        /**
         * 商户密钥
         */
        private String mchKey = "demo_mch_key_32_characters_long";

        /**
         * 微信支付接口地址
         */
        private String apiUrl = "https://api.mch.weixin.qq.com";

        /**
         * 证书路径（退款时需要）
         */
        private String certPath = "/cert/wechat/apiclient_cert.p12";
    }

    /**
     * 银行卡支付配置
     */
    @Data
    public static class BankConfig {
        /**
         * 是否启用
         */
        private boolean enabled = true;

        /**
         * 超时时间（分钟）
         */
        private int timeout = 30;

        /**
         * 商户ID
         */
        private String merchantId = "demo_merchant_id";

        /**
         * 商户密钥
         */
        private String merchantKey = "demo_merchant_key";

        /**
         * 银行卡支付接口地址
         */
        private String apiUrl = "https://api.bank-payment.com";
    }

    /**
     * 余额支付配置
     */
    @Data
    public static class BalanceConfig {
        /**
         * 是否启用
         */
        private boolean enabled = true;

        /**
         * 最小余额（元）
         */
        private double minBalance = 0.01;
    }
}
